Wir alle kennen die bekannte Funktion VLOOKUP(), die uns hilft, Daten aus verschiedenen Tabellen zu kombinieren. Diese Funktion hat jedoch einen wesentlichen Nachteil: Sie kann ähnliche Werte nicht kombinieren, d. h. wenn das Wort einen Fehler enthält, erfolgt keine Übereinstimmung.
Um Näherungswerte kombinieren zu können, können wir eine eigene Funktion erstellen. Nennen wir es FuzzyLookup().
Stellen wir uns vor, wir hätten zwei Listen. Beide haben ungefähr die gleichen Elemente, können aber etwas anders geschrieben sein. Die Aufgabe besteht darin, für jedes Element in der ersten Liste das ähnlichste Element aus der zweiten Liste zu finden, d. h. Implementieren Sie eine Suche nach dem nächstgelegenen maximal ähnlichen Text.
Die große Frage ist in diesem Fall, was unter dem Kriterium „Ähnlichkeit“ zu verstehen ist. Nur die Anzahl übereinstimmender Zeichen? Ist die Anzahl der aufeinanderfolgenden Spiele? Sollten Groß-/Kleinschreibung oder Leerzeichen berücksichtigt werden? Was tun mit unterschiedlicher Anordnung von Wörtern in einer Phrase? Es gibt viele Optionen und es gibt keine einheitliche Lösung – für jede Situation ist die eine oder andere besser als andere.
In unserem Fall implementieren wir die einfachste Option – die Suche nach der maximalen Anzahl von Zeichenübereinstimmungen. Es ist nicht perfekt, funktioniert aber in den meisten Situationen ziemlich gut.
Hinzufügen Funktion FuzzyLookup , öffnen Sie das Menü Tools - Macros - Edit Macros... , wählen Module1 und kopieren Sie den folgenden Text in das Modul:
Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String
' moonexcel.com.ua
Dim Str As String
Dim CellArray As Variant
Dim StrArray As Variant
If IsMissing(SimThreshold) Then SimThreshold = 0
Str = LCase(LookupValue)
StrArray = Split(Str)
StrExt = UBound(StrArray)
For Each Cell In SrcTable
CellArray = Split(LCase(Cell))
CellExt = UBound(CellArray)
CellRate = 0
' Wir überprüfen jedes Wort in der Suchphrase
For x = 0 To StrExt
StrWord = StrArray(x)
If Len(StrWord) = 0 Then GoTo continue_x
MaxStrWordRate = 0
' Wir überprüfen jedes Wort in der nächsten Zelle aus der ursprünglichen Wertetabelle
For i = 0 To CellExt
CellWord = CellArray(i)
If Len(CellWord) = 0 Then GoTo continue_i
FindCharNum = OccurrenceNum(StrWord, CellWord)
StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))
If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate
continue_i:
Next i
CellRate = CellRate + MaxStrWordRate
continue_x:
Next x
' Wir behalten das beste Spiel
If CellRate > MaxCellRate Then
MaxCellRate = CellRate
BestCell = Cell
FindCharNum = OccurrenceNum(Str, Cell)
SimRate = FindCharNum / Max(Len(Str),Len(Cell))
End If
Next Cell
IF SimRate >= SimThreshold Then
IF SimThreshold = -1 Then
ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"
ElseIf SimThreshold = -2 Then
ReturnValue = Format(SimRate, "0.00")
Else
ReturnValue = BestCell
End If
Else
ReturnValue = ""
End If
FuzzyLOOKUP = ReturnValue
End Function
Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String)
For i = 1 To Len(SourceString)
' Wir suchen nach dem Vorkommen jedes Symbols
Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)
' Wir erhöhen den Zähler der Zufälle
If Position > 0 Then
Count = Count + 1
' Entfernen Sie das gefundene Symbol
TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)
End If
Next i
OccurrenceNum = Count
End Function
Function Max(ByVal value1 As Variant, ByVal value2 As Variant)
If value1 > value2 Then
Result = value1
Else
Result = value2
End If
Max = Result
End Function
Als nächstes schließen Macro Editor und kehren Sie zum Arbeitsblatt zurück LibreOffice Calc - Jetzt können Sie unsere neue Funktion nutzen FuzzyLookup() .
Sie können die Funktion auch nutzen FUZZYLOOKUP() durch die Installation der kostenlosen Erweiterung YouLibreCalc.oxt oder die Vollversion YLC_Utilities.oxt .
Danach steht diese Funktion in allen Dateien zur Verfügung, die in LibreOffice Calc geöffnet werden.